#pragma GCC optimize(2)
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

int nxt[5];
bool table[8][28];

int H1(char x) //Hash表1,确定当前字符状态
{
    if('0'<=x&&x<='9') return 1;
    else if(x=='+'||x=='-'||x=='*'||x=='/'||x=='^') return 2;
    else if(x=='(') return 3;
    else if(x==')') return 4;
    else if(x=='.') return 5;
    else if(x=='S'||x=='C'||x=='T'||x=='L'||x=='s'||x=='l'||x=='A'||x=='I') return 6;
    else if(x=='e'||x=='p') return 7;
    else return -1;
}

int H2(char x) //Hash表2,为节省table二维数组空间占用,将所有字符整数映射化
{
    if('0'<=x&&x<='9') return x-'0';
    else if(x=='+') return 10;
    else if(x=='-') return 11;
    else if(x=='*') return 12;
    else if(x=='/') return 13;
    else if(x=='(') return 14;
    else if(x==')') return 15;
    else if(x=='.') return 16;
    else if(x=='S') return 17;
    else if(x=='C') return 18;
    else if(x=='T') return 19;
    else if(x=='L') return 20;
    else if(x=='^') return 21;
    else if(x=='s') return 22;
    else if(x=='l') return 23;
    else if(x=='A') return 24;
    else if(x=='I') return 25;
    else if(x=='e') return 26;
    else if(x=='p') return 27;
    else return -1;
}

int Prior(char op) //定义运算符号的优先级
{
    if(op=='+'||op=='-') return 1;
    else if(op=='*'||op=='/') return 2;
    else if(op=='^') return 3;
    else if(op=='S'||op=='C'||op=='T'||op=='L'||op=='s'||op=='l'||op=='A'||op=='I') return 4;
    else return 0;
}

void GetTable()
{
    int i;
    //0:初始状态
    for(i=0;i<=11;i++) table[0][i]=true;
    table[0][14]=true;
    for(i=17;i<=20;i++) table[0][i]=true;
    table[0][26]=table[0][27]=true;
    //1:数字状态
    for(i=0;i<=13;i++) table[1][i]=true;
    for(i=15;i<=25;i++) table[1][i]=true;
    //2:+ - * / ^状态
    for(i=0;i<=9;i++) table[2][i]=true;
    table[2][14]=true;
    for(i=17;i<=20;i++) table[2][i]=true;
    table[2][26]=table[2][27]=true;
    //3:(状态
    for(i=0;i<=11;i++) table[3][i]=true;
    table[3][14]=true;
    table[3][26]=table[3][27]=true;
    //4:)状态
    for(i=10;i<=13;i++) table[4][i]=true; 
    table[4][15]=true;
    for(i=17;i<=27;i++) table[4][i]=true;
    //5:.状态
    for(i=0;i<=9;i++) table[5][i]=true;
    //6 S C T L s l A I状态
    for(i=0;i<=9;i++) table[6][i]=true;
    table[6][14]=true;
    table[6][26]=table[6][27]=true;
    //7 e p 状态
    for(i=10;i<=13;i++) table[7][i]=true;
    table[7][15]=true;
    for(i=17;i<=25;i++) table[7][i]=true;
}

class Node //用于后缀表达式计算的节点类
{
    public:
        char tag; //节点存储数据类型
        long double val; //运算处理时的值
        Node(long double x); //值构造
        Node(char x); //符号构造
};

Node::Node(long double x):tag(0),val(x) {}
Node::Node(char x):tag(x),val(0) {}

class Equation //式子类
{
    private:
        string X; //存放表达式
        vector<Node> Post; //存放后缀表达式 
        void Replace(string A,string B); //内置函数,用于处理sin,cos等运算
    public:
        Equation(); //构造函数
        void InputExpression(); //输入表达式
        void PreProcess(); //预处理表达式
        void Reset(); //重置参数
        void Error(); //报错
        bool Verdict(); //判断是否合法
        long double Calculate(); //计算表达式的值
        string GetExpression(); //返回表达式
};

Equation::Equation():X() {}
void Equation::InputExpression() {getline(cin,X);}  
void Equation::Error() {MessageBox(NULL,"The expression you input is invaild!Please input again!","System",MB_OK);}
string Equation::GetExpression() {return X;}

void Equation::Replace(string A,string B) //将表达式中的sin,cos,tan,ln字符替换为S,C,T,L
{
    int i=1,j=0,len=A.length();
	nxt[0]=-1;
	while(i<A.length())
	{
		if(j==-1||A[i]==A[j]) nxt[++i]=++j;
		else j=nxt[j];
	}
    i=0,j=0;
	while(i<X.length())
	{
		if(j==-1||X[i]==A[j]) ++i,++j;
		else j=nxt[j];
		if(j==A.length())
		{
            X.erase(i-j,len);
            X.insert(i-j,B);
			j=nxt[j];
		}
	}
}

void Equation::PreProcess()
{
    int i=1,j=0;
    string Temp="";
    //将用户输入sin,cos,tan,ln的运算字符分别转换为S,C,T,L.方便计算处理.
    Replace("sin","S  ");
    Replace("cos","C  ");
    Replace("tan","T  ");
    Replace("ln","L ");
    Replace("sqrt","s   ");
    Replace("log","l  ");
    Replace("abs","A  ");
    Replace("lg","I ");
    //删除多余空格
    for(i=0;i<X.length();i++) if(X[i]!=' ') Temp.push_back(X[i]);
    X=Temp;
    //处理前缀符号+与-
    if(X[0]=='+'||X[0]=='-') X.insert(0,1,'0');
    for(i=1;i<X.length();i++) if((X[i]=='+'||X[i]=='-')&&X[i-1]=='(') X.insert(i,1,'0');
    //处理表达式中省略的写法
    if(X[0]=='S'||X[0]=='C'||X[0]=='T'||X[0]=='L'||X[0]=='s'||X[0]=='l'||X[0]=='A'||X[0]=='I') X.insert(0,1,'1');
    for(i=1;i<X.length();i++) if((X[i-1]=='+'||X[i-1]=='-'||X[i-1]=='*'||X[i-1]=='/'||X[i-1]=='^'||X[i-1]=='(')&&(X[i]=='S'||X[i]=='C'||X[i]=='T'||X[i]=='L'||X[i]=='s'||X[i]=='l'||X[i]=='A'||X[i]=='I')) X.insert(i,1,'1');
    for(i=1;i<X.length();i++) if(H1(X[i-1])==1&&(X[i]=='p'||X[i]=='e')) X.insert(i,1,'*');
}

void Equation::Reset() {Post.clear();}

bool Equation::Verdict()
{
    int i,cnt=0,state=0,las=-1;
    bool flag=false;
    long double temp1=0,temp2=0,k=1;
    stack<char> st; 
    for(i=0;i<X.length();i++)
    {
        if(X[i]=='(') ++cnt;
        else if(X[i]==')') --cnt;
        if(cnt<0||state==-1) return false;
        if(!table[state][H2(X[i])]) return false;
        else state=H1(X[i]);
        if(state==1)
        {
            if(!flag) temp1=temp1*10+X[i]-'0';
            else k/=10,temp2+=k*(X[i]-'0');
        }
        else if(state==7)
        {
            if(X[i]=='e') Post.push_back((Node)((long double)M_E));
            else if(X[i]=='p') Post.push_back((Node)((long double)M_PI));
        }
        else
        {
            if(las==1&&state!=5) 
            {
                Post.push_back((Node)(temp1+temp2));
                flag=false,k=1,temp1=temp2=0;
            }
            if(state==2||state==6)
            {
                while(!st.empty()&&(H1(st.top())==2||H1(st.top())==6)&&Prior(X[i])<=Prior(st.top())) 
                {
                    Post.push_back((Node)(st.top()));
                    st.pop();
                }
                st.push(X[i]);
            }
            else if(state==3) st.push(X[i]);
            else if(state==4)
            {
                while(H1(st.top())!=3)
                {
                    Post.push_back((Node)(st.top()));
                    st.pop();
                }
                st.pop();
            }
            else if(state==5) flag=true;
        }
        las=state;
    }
    if(state==1) Post.push_back((Node)(temp1+temp2));
    while(!st.empty())
    {
        Post.push_back((Node)(st.top()));
        st.pop();
    }
    return !cnt&&(H1(X[i-1])==1||H1(X[i-1])==4||H1(X[i-1])==7);
}

long double Equation::Calculate() 
{
    int i;
    long double val1,val2;
    stack<long double> temp; 
    for(i=0;i<Post.size();i++) //后缀表达式计算答案
    {
        if(!Post[i].tag) temp.push(Post[i].val);
        else if(Post[i].tag=='+') 
        {
            val1=temp.top(); temp.pop(); 
            val2=temp.top(); temp.pop();
            temp.push(val1+val2);
        }
        else if(Post[i].tag=='-')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2-val1);
        }
        else if(Post[i].tag=='*')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val1*val2);
        }
        else if(Post[i].tag=='/')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2/val1);
        }
        else if(Post[i].tag=='S')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*sin(val1));
        }
        else if(Post[i].tag=='C')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*cos(val1));
        }
        else if(Post[i].tag=='T')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*tan(val1));
        }
        else if(Post[i].tag=='L')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*log(val1));
        }
        else if(Post[i].tag=='^')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(pow(val2,val1));
        }
        else if(Post[i].tag=='s')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*sqrt(val1));
        }
        else if(Post[i].tag=='l')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*log2(val1));
        }
        else if(Post[i].tag=='A')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*abs(val1));
        }
        else if(Post[i].tag=='I')
        {
            val1=temp.top(); temp.pop();
            val2=temp.top(); temp.pop();
            temp.push(val2*log10(val1));
        }
    }
    return temp.top();
}

int main()
{
    Equation E;
    GetTable(); //初始化状态转移表格,用于检测用户输入的表达式是否合法
    while(E.GetExpression()!="quit") //如果用户入的表达式是quit,就会退出程序
    {
        E.InputExpression(); //接受用户输入的表达式
        E.PreProcess(); //对用户输入的表达式进行预处理,例如后缀转化以及省略补全
        //如果用户输入的表达式合法,会计算并输出答案;反之,则会以弹框的形式报错.
        if(!E.Verdict()) E.Error();
        else cout<<'='<<E.Calculate()<<endl;
        E.Reset(); //重置相关数据,为下一次计算做准备
    }
    return 0;
}